package day21;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


/**
主要回顾：输入输出字符流

IO 流分类：
	按数据的流向：
		输入流：
		输出流：
		
	按处理的单位：
		字节流：字节流读取到的都是文件的二进制数据
		字符流：读取数据是以字符为单位（读取到的也是二进制数据，转成也字符）
			字符流 = 字节流 + 解码
----------------------------------------------------------------------------------
字节流
	输入字节流：
	--------| InputStream	所有输入字节流的基类（抽象类）
	------------| FileInputStream	读取文件数据的输入字节流
	------------| BufferedInputStream	缓冲输入字节流（内维护一个 8kB 的字节数组）
	
	
	输出字节流
	--------| OutputStream	所有输出字节流的基类（抽象类）
	------------| FileOutputStream	输出文件数据的输出字节流


----------------------------------------------------------------------------------
字符流
	输入字符流：
	--------| Reader	所有输入字符流的基类（抽象类）
	------------| FileReader	读取文件数据的输入字符流
	------------| BufferedReader	缓冲文件数据的输入字符流，提高效率，同时拓展了功能
	
	
	输出字符流
	--------| Writer	所有输出字节流的基类（抽象类）
	------------| FileWriter	输出文件数据的输出字节流
	------------| BufferedWriter	缓冲文件数据的输出字节流，提高效率，同时拓展了功能
*/
public class ReaderWriter {

	public static void main(String[] args) throws IOException {
//		readerTest1();
//		readerTest2();
//		writerTest();
//		bufferReader();
		bufferWriter();
	}
	
	public static void readerTest1() throws IOException {
		//1. 找到目标文件
		File file = new File("test.txt");
		//2. 建立数据通道
		FileReader fileReader = new FileReader(file);
		//3. 读取文件数据
		int content = -1;
		while ((content = fileReader.read()) != -1) {
		//4. 处理文件数据
			System.out.print((char)content);
		}
		//5. 关闭文件资源
		fileReader.close();
	}
	
	public static void readerTest2() throws IOException {
		//1. 找到目标文件
		File file = new File("test.txt");
		//2. 建立数据通道
		FileReader fileReader = new FileReader(file);
		//3. 读取文件数据
		char[] cbuf = new char[1024];
		int length = -1;
		while ((length = fileReader.read(cbuf)) != -1) {
		//4. 处理文件数据
			System.out.print(new String(cbuf, 0, length));
		}
		//5. 关闭文件资源
		fileReader.close();
	}

	public static void writerTest() throws IOException {
		//1. 找到目标
		File file = new File("writeTest.txt");
		//2. 建立数据通道
//		FileWriter fileWriter = new FileWriter(file,true);	//追加数据
		FileWriter fileWriter = new FileWriter(file);		//覆盖
		//3. 写出数据
		String data = "测试 FileWriter 类。\n哈哈哈哈";
		fileWriter.write(data);	//具备解码功能
//		fileWriter.flush();	//手动刷出数据，缓冲区满，文件资源关闭时会自动写入
		//4. 关闭文件资源
		fileWriter.close();
	}
	
	public static void bufferReader() throws IOException {
		//1. 找到目标文件
		File file = new File("test.txt");
		//2. 建立数据通道
		FileReader in = new FileReader(file);
		BufferedReader bReader = new BufferedReader(in);
		//3. 读取文件数据
		//4. 处理文件数据
//		int content = bReader.read();
//		System.out.println((char)content);
		//3. 读取文件数据
		String line = null;
		while ((line = bReader.readLine()) != null) {
		//4. 处理文件数据
			System.out.println(line);
		}
		//5. 关闭文件资源
		bReader.close();
	}
	
	public static void bufferWriter() throws IOException {
		//1. 找到目标文件
		File file = new File("test1.txt");
		//2. 建立数据通道
		FileWriter out = new FileWriter(file);
		BufferedWriter bWriter = new BufferedWriter(out);
		//3. 写出文件数据
		bWriter.write("大家好呀啊呀呀～\ntest\r哈哈");
//		bWriter.newLine();	//换行
//		bWriter.flush();//手动写入，当缓冲区满或者关闭文件时会自动写入
		//4. 关闭文件资源
		bWriter.close();
	}
}
